#include "bootpack.h"
#include "FunToolos.h"

static unsigned char rgb[16 * 3] = {
    0x00, 0x00, 0x00,  // 黑色
    0xff, 0x00, 0x00,  // 亮红色
    0x00, 0xff, 0x00,  // 亮绿色
    0xff, 0xff, 0x00,  // 亮黄色
    0x00, 0x00, 0xff,  // 亮蓝色
    0xff, 0x00, 0xff,  // 亮紫色
    0x00, 0xff, 0xff,  // 浅亮蓝色
    0xff, 0xff, 0xff,  // 白色
    0xc6, 0xc6, 0xc6,  // 亮灰色
    0x84, 0x00, 0x00,  // 暗红色
    0x00, 0x84, 0x00,  // 暗绿色
    0x84, 0x84, 0x00,  // 暗黄色
    0x00, 0x00, 0x84,  // 暗蓝色
    0x84, 0x00, 0x84,  // 暗紫色
    0x00, 0x84, 0x84,  // 浅暗蓝色
    0x84, 0x84, 0x84   // 暗灰色
};

void init_color_table(char* rgb_data) {
    int i, eflags;
    // 保存中断现场
    eflags = _read_eflags();
    // 关闭中断
    _disable_interrupt();
    _write_mem8(0x03c8, 0);
    for (i = 0; i <= 15; i++) {
        _write_mem8(0x03c9, rgb_data[0] / 4);
        _write_mem8(0x03c9, rgb_data[1] / 4);
        _write_mem8(0x03c9, rgb_data[2] / 4);
        rgb_data += 3;
    }
    // 打开中断
    _enable_interrupt();
    // 恢复中断现场
    _write_eflags(eflags);
}

void boxfill8(unsigned char* vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) {
    for (int y = y0; y <= y1; y++) {
        for (int x = x0; x <= x1; x++) {
            vram[y * xsize + x] = c;
        }
    }
}

void HariMain(void) {
    int i;
    char* p;

    p = (char*)0xa0000;

    boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120);
    boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150);
    boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180);

    for (;;) {
        _io_hlt();
    }
}
